#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
'''
先乘再除，数有点大，出现了7.63206222779e-411.714285714，float不认识了。
def ComputeMulDiv(li):
    content=li[0]
    print content
    MathchMul=re.search('\d+\.?\d*[\*]+[\+\-]?\d+\.?\d*',content)
    MathchDiv=re.search('\d+\.?\d*[\/]+[\+\-]?\d+\.?\d*',content)
    if MathchMul:
        Pcontent=MathchMul.group()
        m,n=Pcontent.split('*')
        result=float(m)*float(n)
        before,after=re.split('\d+\.?\d*[\*]+[\+\-]?\d+\.?\d*',content,1)
        new_content='%s%s%s'%(before,result,after)
        li[0]=new_content
        ComputeMulDiv(li)
    elif MathchDiv:
        Pcontent=MathchDiv.group()
        m,n=Pcontent.split('/')
        result=float(m)/float(n)
        before,after=re.split('\d+\.?\d*[\/]+[\+\-]?\d+\.?\d*',content,1)
        new_content='%s%s%s'%(before,result,after)
        li[0]=new_content
        ComputeMulDiv(li)
    else:
        return
'''
def ComputeMulDiv(li):
    '''
    8、计算乘除函数
        8.1、判断有没有乘除法,没有则返回计算内容 让加减函数继续计算
        8.2、正则找出乘除的计算内容
    '''
    content=li[0]
    if not re.search('\d+\.?\d*[\*\/]+[\+\-]?\d+\.?\d*',content):
        return
    Match=re.search('\d+\.?\d*[\*\/]+[\+\-]?\d+\.?\d*',content).group()
    if len(Match.split("*"))>1:
        m,n=Match.split("*")
        result=float(m)*float(n)
    else:
        m,n=Match.split("/")
        result=float(m)/float(n)
    before,after=re.split('\d+\.?\d*[\*\/]+[\+\-]?\d+\.?\d*',content,1)
    content="%s%s%s"%(before,result,after)
    li[0]=content
    ComputeMulDiv(li)

def ComputeAddSub(li):
    '''
    9、计算加减函数,方法类型乘除
    11、因为有’-‘号的存在，有可能造成两个符号叠加在一起，按照正负法则，精简符号。
    12、解决开头为‘-’的情况，利用一个临时符号，把加减对调，最后不取前面的符号。后面会总体取反。
    '''
    while True:
        if "+-" in li[0] or "++" in li[0] or "--" in li[0] or "-+" in li[0]:
            li[0]=li[0].replace("++","+")
            li[0]=li[0].replace("+-","-")
            li[0]=li[0].replace("-+","-")
            li[0]=li[0].replace("--","+")
        else:
            break

        if li[0].startswith('-'):
            li[1]+=1
            li[0]=li[0].replace("-","&")
            li[0]=li[0].replace("+","-")
            li[0]=li[0].replace("&","+")
            li[0]=li[0][1:]

    content=li[0]
    if not re.search('\d+\.?\d*[\+\-]{1}\d+\.?\d*',content):
        return
    MatchAddSub=re.search('\d+\.?\d*[\+\-]{1}\d+\.?\d*',content).group()
    if len(MatchAddSub.split("+"))>1:
        m,n=MatchAddSub.split("+")
        val=float(m)+float(n)
    else:
        m,n=MatchAddSub.split("-")
        val=float(m)-float(n)
    before,after=re.split('\d+\.?\d*[\+\-]{1}\d+\.?\d*',content,1)
    content="%s%s%s"%(before,val,after)
    li[0]=content
    ComputeAddSub(li)

def compute(content):
    '''
    7、计算函数
        包括计算乘除加减
    10、递归的结果到列表
        递归函数中只能返回none，所以设定一个列表，递归循环结束，列表不变；
    13、判断有没有上面取出来的‘-’号，乘回去，总体取反。
    '''
    ContentList=[content,0]
    ComputeMulDiv(ContentList)
    ComputeAddSub(ContentList)
    if divmod(ContentList[1],2)[1]==1:
        result=float(ContentList[0])
        result=result*-1
    else:
        result=float(ContentList[0])
    return result



def express(expression):
    '''
    1、取出第一个最内层括号
        用正则匹配括号开头，括号结尾，中间只包含【运算符+数字】组合的表达式。
    2、按表达式切割成3部分
        re.split()
    3、计算匹配的表达式
        定义计算函数，先乘除后加减
    4、计算后拼接成新表达式
        拼接字符串
    5、反复查找最内层括号，切割，计算，拼接
        递归函数，把拼接的新字符串传给当前函数循环
    6、判断是否还有内层括号
        没有就计算最终结果
    '''
    if not re.search('\(([\+\-\*\/]*\d+\.?\d*){2,}\)',expression):  #找不到内层括号就计算结果
        final=compute(expression)
        return final    #整个题目的结果计算
    #开始想判断content，但是匹配不到内容，再加group()就会报错，所以if判断只能放在content上面。
    content=re.search('\(([\+\-\*\/]*\d+\.?\d*){2,}\)',expression).group()
    content=content[1:len(content)-1]
    result=compute(content)
    before,non,after=re.split('\(([\+\-\*\/]*\d+\.?\d*){2,}\)',expression,1)
    new_ex="%s%s%s"%(before,result,after)
    return express(new_ex)

if __name__=="__main__":
    expression='1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
    expression=re.sub("\s*",'',expression)  #用正则的形式去掉字符串中的空白符号
    print express(expression)